home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / parallel / lindasrc < prev    next >
Text File  |  1992-04-11  |  24KB  |  611 lines

  1. /*===================================================================*/
  2. /*----Linda Arity Prolog Tuple Server and Client Libraries           */
  3. /*----                                                               */
  4. /*----Written by Geoff Sutcliffe, August 1990                        */
  5. /*===================================================================*/
  6. /*----Server library                                                 */
  7. /*===================================================================*/
  8. /*----Start the server, with a goal and its Prolog file              */
  9. server_go(Server_machine,Client_machine_definitions,
  10. Communication_information):-
  11.     assertz(server_machine__(Server_machine)),
  12.     convert_machine_definitions_to_names__(Client_machine_definitions,
  13. Client_machines),
  14.     set_up_server_communications__(Server_machine,Client_machines,
  15. Communication_information),
  16.     !,
  17.     initialise_client_machines__(Client_machines),
  18.     control_service__,
  19.     terminate_client_machines__(Client_machines),
  20.     close_down_server_communications__(Server_machine,Client_machines,
  21. Communication_information),
  22.     retract_once__(server_machine__(Server_machine)).
  23.  
  24. server_go(_,_):-
  25.     write('Error   : Communications not set up'),
  26.     nl.
  27. /*-------------------------------------------------------------------*/
  28. convert_machine_definition_to_names__(Machine_definition,[]):-
  29.     Machine_definition =.. [_,Index],
  30.     Index < 1,
  31.     !.
  32.  
  33. convert_machine_definition_to_names__(Machine_definition,
  34. [Machine_definition]):-
  35.     Machine_definition =.. [_,1],
  36.     !.
  37.  
  38. convert_machine_definition_to_names__(Machine_definition,
  39. [Machine_definition|Rest_of_names]):-
  40.     Machine_definition =.. [Actual_name,Index],
  41.     Next_index is Index - 1,
  42.     Next_machine_definition =.. [Actual_name,Next_index],
  43.     convert_machine_definition_to_names__(Next_machine_definition,
  44. Rest_of_names).
  45. /*-------------------------------------------------------------------*/
  46. /*----Convert names like bison(3) into bison(0),bison(1),bison(2)    */
  47. convert_machine_definitions_to_names__([],[]).
  48.  
  49. convert_machine_definitions_to_names__([First_machine_definition|
  50. Rest_of_machine_definitions],Client_machine_names):-
  51.     convert_machine_definition_to_names__(First_machine_definition,
  52. First_names),
  53.     convert_machine_definitions_to_names__(Rest_of_machine_definitions,
  54. Rest_of_names),
  55.     append__(First_names,Rest_of_names,Client_machine_names).
  56. /*-------------------------------------------------------------------*/
  57. /*----Get a list of all available machines, in use and not in use    */
  58. get_machines_lists__(Machines_in_use,Machines_not_in_use):-
  59.     findall(Machine_in_use,machine__(Machine_in_use,in_use),
  60. Machines_in_use),
  61.     findall(Machine_not_in_use,machine__(Machine_not_in_use,
  62. not_in_use),Machines_not_in_use).
  63. /*-------------------------------------------------------------------*/
  64. /*----Repeatedly allow the user to specify a goal and file           */
  65. control_service__:-
  66.     write('Options : "start" client; "exit" : '),
  67.     read(Option),
  68.     Option.
  69. /*-------------------------------------------------------------------*/
  70. /*----Do the option chosen by the user in service control            */
  71. start:-
  72.     get_machines_lists__(Machines_in_use,Machines_not_in_use),
  73.     write('In use  : '),
  74.     write(Machines_in_use),
  75.     nl,
  76.     write('Free    : '),
  77.     write(Machines_not_in_use),
  78.     nl,
  79.     write('Client  : '),
  80.     read(Client),
  81.     write('Goal    : '),
  82.     read(Goal),
  83.     write('Files   : '),
  84.     read(Files),
  85.     server_machine__(Server_machine),
  86.     server_eval__(Server_machine,Client,Goal,Files),
  87.     serve__,
  88.     control_service__.
  89.  
  90. exit.
  91. /*-------------------------------------------------------------------*/
  92. /*----If no machines in use the serving is over                      */
  93. serve__:-
  94.     repeat,
  95.     receive_term_from_any_client__(Request),
  96.     do_request__(Request),
  97.     not(machine__(_,in_use)).
  98. /*-------------------------------------------------------------------*/
  99. /*----Do a client request by simply evaluating it                    */
  100. do_request__(Request):-
  101.     Request,
  102.     !.
  103.  
  104. /*----If a request fails, then output                                */
  105. do_request__(Request):-
  106.     write('Error   : '),
  107.     write(Request),
  108.     write(' : failed'),
  109.     nl.
  110. /*-------------------------------------------------------------------*/
  111. /*----Start up the client machines by noting their availability      */
  112. initialise_client_machines__([]).
  113.  
  114. initialise_client_machines__([First_client|Rest_of_clients]):-
  115.     power_up_machine__(First_client),
  116.     assertz(machine__(First_client,not_in_use)),
  117.     initialise_client_machines__(Rest_of_clients).
  118. /*-------------------------------------------------------------------*/
  119. /*----Stop client machine by sending them a message to say it's all  */
  120. /*----over, and denoting their availability                          */
  121. terminate_client_machines__([]).
  122.  
  123. terminate_client_machines__([First_client_machine|
  124. Rest_of_client_machines]):-
  125.     debug_write__('Close   : '),
  126.     debug_write__(First_client_machine),
  127.     debug_nl__,
  128.     power_down_machine__(First_client_machine),
  129.     retract_once__(machine__(First_client_machine,not_in_use)),
  130.     terminate_client_machines__(Rest_of_client_machines).
  131. /*-------------------------------------------------------------------*/
  132. /*===================================================================*/
  133. /*----Procedures for doing eval requests
  134. /*===================================================================*/
  135. /*----Start a new query in a Prolog file                             */
  136. server_eval__(Originating_machine,Machine,Goal,Files):-
  137.     retract_once__(machine__(Machine,not_in_use)),
  138.     !,
  139.     start_client__(Machine),
  140.     assertz(machine__(Machine,in_use)),
  141.     send_term_to_client__(Machine,client_eval__(Machine,Goal,
  142. Files)),
  143.     debug_write__('Client  : '),
  144.     debug_write__(Originating_machine),
  145.     debug_write__(' : starts : '),
  146.     debug_write__(Machine),
  147.     debug_write__(' : '),
  148.     debug_write__(Goal),
  149.     debug_write__(' : '),
  150.     debug_write__(Files),
  151.     debug_nl__.
  152.  
  153. server_eval__(Originating_machine,Machine,Goal,Files):-
  154.     check_machine_is_in_use__(Machine),
  155.     !,
  156.     note_waiting__(server_eval__(Originating_machine,Machine,Goal,
  157. Files)),
  158.     debug_write__('Wait    : '),
  159.     debug_write__(Machine),
  160.     debug_write__(' : '),
  161.     debug_write__(Goal),
  162.     debug_write__(' : '),
  163.     debug_write__(Files),
  164.     debug_nl__.
  165.  
  166. server_eval__(Originating_machine,Machine,Goal,Files):-
  167.     write('Error   : eval for non-existant machine : '),
  168.     write(Machine),
  169.     nl.
  170. /*-------------------------------------------------------------------*/
  171. /*----Check that a requested machine does exist, taking into account */
  172. /*----under specified machine names.                                 */
  173. check_machine_is_in_use__(Machine):-
  174.     var(Machine),
  175.     !,
  176.     machine__(_,in_use).
  177.  
  178. check_machine_is_in_use__(Machine):-
  179.     Machine =.. [Name,Index],
  180.     var(Index),
  181.     !,
  182.     Machine_to_check =.. [Name,_],
  183.     machine__(Machine_to_check,in_use).
  184.  
  185. check_machine_is_in_use__(Machine):-
  186.     machine__(Machine,in_use).
  187. /*-------------------------------------------------------------------*/
  188. /*----Start a new query in a Prolog file, if possible. Return info   */
  189. server_evalp__(Originating_machine,Machine,Goal,Files):-
  190.     retract_once__(machine__(Machine,not_in_use)),
  191.     !,
  192.     assertz(machine__(Machine,in_use)),
  193.     start_client__(Machine),
  194.     send_term_to_client__(Machine,client_eval__(Machine,Goal,
  195. Files)),
  196.     send_term_to_client__(Originating_machine,Machine),
  197.     debug_write__('Client  : '),
  198.     debug_write__(Originating_machine),
  199.     debug_write__(' : starts : '),
  200.     debug_write__(Machine),
  201.     debug_write__(' : '),
  202.     debug_write__(Goal),
  203.     debug_write__(' : '),
  204.     debug_write__(Files),
  205.     debug_nl__.
  206.  
  207. server_evalp__(Originating_machine,Machine,Goal,Files):-
  208.     send_term_to_client__(Originating_machine,fail),
  209.     debug_write__('Fail    : '),
  210.     debug_write__(Machine),
  211.     debug_write__(' : '),
  212.     debug_write__(Goal),
  213.     debug_write__(' : '),
  214.     debug_write__(Files),
  215.     debug_nl__.
  216. /*-------------------------------------------------------------------*/
  217. /*----This is executed by the server when the client has completed an*/
  218. /*----eval                                                           */
  219. end_eval__(Machine):-
  220.     debug_write__('End     : '),
  221.     debug_write__(Machine),
  222.     debug_nl__,
  223.     retract_once__(machine__(Machine,in_use)),
  224.     stop_client__(Machine),
  225.     assertz(machine__(Machine,not_in_use)),
  226.     redo_waiting_requests__(machine__(Machine,not_in_use)).
  227. /*===================================================================*/
  228. /*----Procedures for out requests                                    */
  229. /*===================================================================*/
  230. /*----Execute out, checking for any ins and rds waiting for the tuple*/
  231. server_out__(Machine,Tuple):-
  232.     do_server_out__(Machine,Tuple),
  233.     redo_waiting_requests__(Tuple).
  234. /*-------------------------------------------------------------------*/
  235. /*----This actually puts the tuple in tuple space                    */
  236. do_server_out__(Machine,Tuple):-
  237.     assertz(Tuple),
  238.     debug_write__('Added   : '),
  239.     debug_write__(Tuple),
  240.     debug_write__(' : from : '),
  241.     debug_write__(Machine),
  242.     debug_nl__.
  243. /*===================================================================*/
  244. /*----Procedures for in requests                                     */
  245. /*===================================================================*/
  246. /*----Execute in, if not possible then put on waiting queue          */
  247. server_in__(Machine,Tuple):-
  248.     do_server_in__(Machine,Tuple),
  249.     !,
  250.     send_term_to_client__(Machine,Tuple).
  251.  
  252. server_in__(Machine,Tuple):-
  253.     debug_write__('in wait : '),
  254.     debug_write__(Tuple),
  255.     debug_write__(' : for : '),
  256.     debug_write__(Machine),
  257.     debug_nl__,
  258.     note_waiting__(server_in__(Machine,Tuple)).
  259. /*-------------------------------------------------------------------*/
  260. /*----Execute inp, if not possible return fail                       */
  261. server_inp__(Machine,Tuple):-
  262.     do_server_in__(Machine,Tuple),
  263.     !,
  264.     send_term_to_client__(Machine,Tuple).
  265.  
  266. server_inp__(Machine,Tuple):-
  267.     send_term_to_client__(Machine,fail),
  268.     debug_write__('No inp  : '),
  269.     debug_write__(Tuple),
  270.     debug_write__(' : for : '),
  271.     debug_write__(Machine),
  272.     debug_nl__.
  273. /*-------------------------------------------------------------------*/
  274. /*----This actually gets the tuple out of tuple space                */
  275. do_server_in__(Machine,Tuple):-
  276.     retract_once__(Tuple),
  277.     debug_write__('Removed : '),
  278.     debug_write__(Tuple),
  279.     debug_write__(' : to : '),
  280.     debug_write__(Machine),
  281.     debug_nl__.
  282. /*===================================================================*/
  283. /*----Procedures for rd requests                                     */
  284. /*===================================================================*/
  285. /*----Execute rd if not possible then put on waiting queue           */
  286. server_rd__(Machine,Tuple):-
  287.     do_server_rd__(Machine,Tuple),
  288.     !,
  289.     send_term_to_client__(Machine,Tuple).
  290.  
  291. server_rd__(Machine,Tuple):-
  292.     debug_write__('rd wait : '),
  293.     debug_write__(Tuple),
  294.     debug_write__(' : for : '),
  295.     debug_write__(Machine),
  296.     debug_nl__,
  297.     note_waiting__(server_rd__(Machine,Tuple)).
  298. /*-------------------------------------------------------------------*/
  299. /*----Execute rdp, if not possible return fail                       */
  300. server_rdp__(Machine,Tuple):-
  301.     do_server_rd__(Machine,Tuple),
  302.     !,
  303.     send_term_to_client__(Machine,Tuple).
  304.  
  305. server_rdp__(Machine,Tuple):-
  306.     send_term_to_client__(Machine,fail),
  307.     debug_write__('No rdp  : '),
  308.     debug_write__(Tuple),
  309.     debug_write__(' : for : '),
  310.     debug_write__(Machine),
  311.     debug_nl__.
  312. /*-------------------------------------------------------------------*/
  313. /*----Execute rdall, returning the collected tuples                  */
  314. server_rdall__(Machine,Tuple,Maximum_replies):-
  315.     findallmax__(Tuple,Tuple,Reply_tuples,Maximum_replies),
  316.     send_term_to_client__(Machine,Reply_tuples).
  317. /*-------------------------------------------------------------------*/
  318. /*----This actually checks for the tuple in tuple space              */
  319. do_server_rd__(Machine,Tuple):-
  320.     Tuple,
  321.     debug_write__('Examine : '),
  322.     debug_write__(Tuple),
  323.     debug_write__(' : for : '),
  324.     debug_write__(Machine),
  325.     debug_nl__.
  326. /*-------------------------------------------------------------------*/
  327. /*----muProlog fix for tuples that aren't defined                    */
  328. traperror(enoproc,_,fail).
  329. /*===================================================================*/
  330. /*----Procedures for the waiting queue                               */
  331. /*===================================================================*/
  332. /*-------------------------------------------------------------------*/
  333. /*----Initial waiting list is empty                                  */
  334. waiting_list__([]).
  335. /*-------------------------------------------------------------------*/
  336. note_waiting__(Request):-
  337.     retract(waiting_list__(List)),
  338.     assertz(waiting_list__([Request|List])).
  339. /*-------------------------------------------------------------------*/
  340. redo_waiting_requests__(Outed_tuple):-
  341.     retract(waiting_list__(Waiting_requests)),
  342.     assertz(waiting_list__([])),
  343.     doall__(Waiting_requests).
  344. /*-------------------------------------------------------------------*/
  345. doall__([]):-
  346.     !.
  347.  
  348. doall__([First|Rest]):-
  349.     First,
  350.     doall__(Rest).
  351. /*===================================================================*/
  352. /*----Remote i/o procedures                                          */
  353. /*===================================================================*/
  354. server_remote_write__(Machine,Term):-
  355.     write(Machine),
  356.     write(' : '),
  357.     write(Term),
  358.     nl.
  359. /*-------------------------------------------------------------------*/
  360. /*===================================================================*/
  361. /*----Client library                                                 */
  362. /*===================================================================*/
  363. /*----This is for networks that have to have the client machines     */
  364. /*----started manually.                                              */
  365. client_go(Server_machine,Client_machine,Communication_information):-
  366.     set_up_client_communications__(Server_machine,Client_machine,
  367. Communication_information),
  368.     !,
  369.     client_machine_loop__,
  370.     close_down_client_communications__(Server_machine,Client_machine,
  371. Communication_information).
  372.  
  373. client_go(_,_):-
  374.     write('Error   : Communications not set up'),
  375.     nl.
  376. /*-------------------------------------------------------------------*/
  377. /*----A manually started machine sits and waits for client_eval__ and*/
  378. /*----exit__ mesages                                                 */
  379. client_machine_loop__:-
  380.     repeat,
  381.     receive_term_from_server__(Reply),
  382.     Reply,
  383.     Reply == exit__.
  384. /*-------------------------------------------------------------------*/
  385. consult_each_file__([]):-
  386.     !.
  387.  
  388. consult_each_file__([First_file|Rest_of_files]):-
  389.     name(First_file,File_list),
  390.     append__("linda/",File_list,Full_list),
  391.     name(Full_file_path,Full_list),
  392.     consult(Full_file_path),
  393.     consult_each_file__(Rest_of_files).
  394. /*-------------------------------------------------------------------*/
  395. /*----This is used to start up a new job on this client.             */
  396. client_eval__(This_machine_name,Goal,Files):-
  397.     assertz(client_machine__(This_machine_name)),
  398.     consult_each_file__(Files),
  399.     Goal,
  400.     !,
  401.     send_request__(end_eval__),
  402.     retract(client_machine__(This_machine_name)).
  403.  
  404. client_eval__(_,_,_):-
  405.     send_request__(end_eval__),
  406.     retract(client_machine__(This_machine_name)).
  407. /*-------------------------------------------------------------------*/
  408. /*----This is used to close down manually started client machines    */
  409. exit__.
  410. /*-------------------------------------------------------------------*/
  411. /*===================================================================*/
  412. /*---Procedures for doing Linda operations                           */
  413. /*===================================================================*/
  414. /*----eval sends a request                                           */
  415. eval(Machine,Goal,Files):-
  416.     send_request__(server_eval__(Machine,Goal,Files)).
  417. /*-------------------------------------------------------------------*/
  418. /*----evalp sends a request                                          */
  419. evalp(Machine,Goal,Files):-
  420.     send_request__(server_evalp__(Machine,Goal,Files)),
  421.     receive_term_from_server__(Machine).
  422. /*-------------------------------------------------------------------*/
  423. /*----out sends a request                                            */
  424. out(Tuple):-
  425.     send_request__(server_out__(Tuple)).
  426. /*-------------------------------------------------------------------*/
  427. /*----in sends a request and reads the reply                         */
  428. in(Tuple):-
  429.     send_request__(server_in__(Tuple)),
  430.     receive_term_from_server__(Tuple).
  431. /*-------------------------------------------------------------------*/
  432. /*----inp sends a request and reads the reply. The reply may be fail */
  433. inp(Tuple):-
  434.     send_request__(server_inp__(Tuple)),
  435.     receive_term_from_server__(Tuple).
  436. /*-------------------------------------------------------------------*/
  437. /*----rd sends a request and reads the reply                         */
  438. rd(Tuple):-
  439.     send_request__(server_rd__(Tuple)),
  440.     receive_term_from_server__(Tuple).
  441. /*-------------------------------------------------------------------*/
  442. /*----rdp sends a request and reads the reply. The reply may be fail */
  443. rdp(Tuple):-
  444.     send_request__(server_rdp__(Tuple)),
  445.     receive_term_from_server__(Tuple).
  446. /*-------------------------------------------------------------------*/
  447. /*----rdall sends a request for all tuples. Reply is a list          */
  448. rdall(Tuple,Maximum_replies,Reply_tuples):-
  449.     send_request__(server_rdall__(Tuple,Maximum_replies)),
  450.     receive_term_from_server__(Reply_tuples).
  451. /*-------------------------------------------------------------------*/
  452. /*----remote_write asks the server to do output                      */
  453. remote_write(Term):-
  454.     send_request__(server_remote_write__(Term)).
  455. /*-------------------------------------------------------------------*/
  456. /*----Requests sent from a client to the server                      */
  457. send_request__(Request):-
  458. /*----Stuff this machine's name and index on the front               */
  459.     Request =.. [Principle|Arguments],
  460.     member__(Principle,[server_rd__,server_rdp__,server_in__,
  461. server_inp__,server_eval__,server_evalp__,end_eval__,server_out__,
  462. server_remote_write__]),
  463.     !,
  464.     client_machine__(Machine),
  465.     Message =.. [Principle,Machine|Arguments],
  466.     send_term_to_server__(Message).
  467.  
  468. send_request__(Request):-
  469.     send_term_to_server__(Request).
  470. /*-------------------------------------------------------------------*/
  471. /*===================================================================*/
  472. /*----Debugging tools                                                */
  473. /*===================================================================*/
  474. debug_write__(Term):-
  475.     debugging__,
  476.     !,
  477.     write(Term).
  478.  
  479. debug_write__(_).
  480. /*-------------------------------------------------------------------*/
  481. debug_nl__:-
  482.     debugging__,
  483.     !,
  484.     nl.
  485.  
  486. debug_nl__.
  487. /*-------------------------------------------------------------------*/
  488. debugging__:-
  489.     fail.
  490. /*===================================================================*/
  491. /*----Utilities                                                      */
  492. /*===================================================================*/
  493. /*-------------------------------------------------------------------*/
  494. retract_once__(Term):-
  495.     retract(Term),
  496.     !.
  497. /*-------------------------------------------------------------------*/
  498. append__([],List,List).
  499.  
  500. append__([Head|Tail],List,[Head|New_list]):-
  501.     append__(Tail,List,New_list).
  502. /*-------------------------------------------------------------------*/
  503. member__(Element,[Element|_]):-
  504.     !.
  505.  
  506. member__(Element,[_|Tail]):-
  507.     member__(Element,Tail).
  508. /*-------------------------------------------------------------------*/
  509. /*----Quick and dirty findall implementation                         */
  510. findall(Variable,Goal,_):-
  511.     Goal,
  512.     assertz(findall_result__(Variable)),
  513.     fail.
  514.  
  515. findall(_,_,List):-
  516.     collectall__(List).
  517.  
  518. collectall__([First|Rest]):-
  519.     retract(findall_result__(First)),
  520.     !,
  521.     collectall__(Rest).
  522.  
  523. collectall__([]).
  524. /*-------------------------------------------------------------------*/
  525. /*===================================================================*/
  526. /*----muProlog specific stuff                                        */
  527. /*===================================================================*/
  528. /*----Start up for muProlog clients. The interpreter starts after the*/
  529. /*----save point. The communicator will exec the saved file, thus if */
  530. /*----any changes are made to this file, linda_go must be re-run to  */
  531. /*----create a new version of the linda file.                        */
  532. make_linda:-
  533.     save(linda),
  534.     receive_term_from_server__(client_eval__(Machine,Goal,Files)),
  535.     client_eval__(Machine,Goal,Files),
  536.     exit(0).
  537. /*-------------------------------------------------------------------*/
  538. make_new_server_entries(_,1,Entries,Entries):-
  539.     !.
  540.  
  541. make_new_server_entries(Server_machine_name,Count,
  542. Rest_of_entries,[First_entry|Rest_of_entries]):-
  543.     New_count is Count - 1,
  544.     First_entry =.. [Server_machine_name,New_count].
  545. /*-------------------------------------------------------------------*/
  546. update_server_entry([First_entry|Rest_of_entries],Server_machine_name,
  547. New_server_entries):-
  548.     First_entry =.. [Server_machine_name,Count],
  549.     !,
  550.     make_new_server_entries(Server_machine_name,Count,
  551. Rest_of_entries,New_server_entries).
  552.  
  553. update_server_entry([First_entry|Rest_of_entries],Server_machine_name,
  554. [First_entry|New_rest_of_entries]):-
  555.     update_server_entry(Rest_of_entries,Server_machine_name,
  556. New_rest_of_entries).
  557. /*-------------------------------------------------------------------*/
  558. make_mugo(Server_machine_name):-
  559.     retract(client_list(Machine_list)),
  560.     update_server_entry(Machine_list,Server_machine_name,
  561. New_machine_list),
  562.     asserta(client_list(New_machine_list)),
  563.     save(mugo),
  564.     client_list(Client_list),
  565.     server_go(server(1),Client_list,null).
  566. /*-------------------------------------------------------------------*/
  567. client_list(
  568. [bettong(1),bilby(1),bison(1),budgie(1),cricket(1),
  569. dunnart(1),hawk(1),kowari(1),melomys(1),narbelek(1),ningaui(1),
  570. numbat(1),planigale(1),potoroo(1),quenda(1),quokka(1),quoll(1),
  571. tammar(1),wambenger(1),warabi(1),woylie(1)]).
  572. /*-------------------------------------------------------------------*/
  573. /*===================================================================*/
  574. /*----Problem specific stuff                                         */
  575. /*===================================================================*/
  576. genetic1(Number_of_transferers,Number_of_breeders,Pool_size,
  577. Breeds,File_name):-
  578. /*    asserta(debugging__),    */
  579. /*    asserta(debugging_net__),   */
  580.     server_machine__(Server_machine),
  581.     client_list([First_client|Rest_of_client_list]),
  582.     first_N(Number_of_transferers,Transferers,Rest_of_client_list,
  583. Other_clients),
  584.     first_N(Number_of_breeders,Breeders,Other_clients,_),
  585.     server_eval__(Server_machine,First_client,
  586. start_breeding(Transferers,Breeders,Pool_size,Breeds,File_name),
  587. [genetic1,File_name]),
  588.     serve__,
  589.     control_service__.
  590. /*-------------------------------------------------------------------*/
  591. first_N(0,[],Left,Left):-
  592.     !.
  593.  
  594. first_N(N,[First|Rest],[First|Available],Left):-
  595.     N1 is N - 1,
  596.     first_N(N1,Rest,Available,Left).
  597. /*-------------------------------------------------------------------*/
  598. genetic2(Number_of_breeders,Pool_size,Breeds,Youth_advantage,
  599. File_name):-
  600. /*    asserta(debugging__),    */
  601. /*    asserta(debugging_net__),   */
  602.     server_machine__(Server_machine),
  603.     client_list([First_client|Rest_of_client_list]),
  604.     first_N(Number_of_breeders,Breeders,Rest_of_client_list,_),
  605.     server_eval__(Server_machine,First_client,
  606. start_breeding(Breeders,Pool_size,Breeds,Youth_advantage,File_name),
  607. [genetic2,File_name]),
  608.     serve__,
  609.     control_service__.
  610. /*-------------------------------------------------------------------*/
  611.